Read N characters given read4() II [call multiple times]

Time: O(N); Space: O(1); hard

The API: read4(buf) -> int reads 4 characters at a time from a file. The return value is the actual number of characters read. For example, it returns 3 if there is only 3 characters left in the file.

By using the read4 API, implement the function read(buf, n) -> int that reads n characters from the file.

Note:

  • The read function may be called multiple times.

[1]:
def read4(buf):
    """
    :type buf: List[str]
    :rtype: int
    """
    global file_content
    i = 0
    while i < len(file_content) and i < 4:
        buf[i] = file_content[i]
        i += 1

    if len(file_content) > 4:
        file_content = file_content[4:]
    else:
        file_content = ""
    return i
[2]:
class Solution1(object):
    def __init__(self):
        self.__buf4 = [''] * 4
        self.__i4 = 0
        self.__n4 = 0

    def read(self, buf, n):
        """
        :type buf: List[str] - Destination buffer
        :type n:   int - Maximum number of characters to read
        :rtype:    int - The number of characters read
        """
        i = 0
        while i < n:
            if self.__i4 < self.__n4:          # Any characters in buf4
                buf[i] = self.__buf4[self.__i4]
                i += 1
                self.__i4 += 1
            else:
                self.__n4 = read4(self.__buf4)  # Read more characters
                if self.__n4:
                    self.__i4 = 0
                else:                           # Buffer has been empty
                    break

        return i
[3]:
if __name__ == "__main__":
    global file_content
    sol = Solution1()
    buf = ['' for _ in range(100)]
    file_content = "ab"
    print(buf[:sol.read(buf, 1)])
    print(buf[:sol.read(buf, 2)])
['a']
['b']